/**
 ****************************************************************************************************
 * @file        tpad.c
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-09-06
 * @brief       电容触摸按键(TPAD) 驱动代码
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 阿波罗 H743开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 * 修改说明
 * V1.0 20220906
 * 第一次发布
 *
 ****************************************************************************************************
 */
 
#include "tpad.h"
#include "main.h"
#include "tim.h"

uint16_t tpad_default_val_data=0;

static void tpad_reset(void);

uint8_t tpad_init(void)
{
	tpad_default_val();
    return 0;
}


static void tpad_reset(void)
{
  GPIO_InitTypeDef gpio_init_struct;

  gpio_init_struct.Pin = GPIO_PIN_5;                               /* ÊäÈë²¶»ñµÄGPIO¿Ú */
  gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;                        /* ¸´ÓÃÍÆÍì */
  gpio_init_struct.Pull = GPIO_PULLDOWN;                              /* ÏÂÀ­ */
  gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                      /* ¸ßËÙ */
  HAL_GPIO_Init(GPIOA, &gpio_init_struct);

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);   /* TPADÒý½ÅÊä³ö0, ·Åµç */
  HAL_Delay(5);

  htim2.Instance->SR = 0;                             /* Çå³ý±ê¼Ç */
  htim2.Instance->CNT = 0;                            /* ¹éÁã */

  gpio_init_struct.Pin = GPIO_PIN_5;                               /* ÊäÈë²¶»ñµÄGPIO¿Ú */
  gpio_init_struct.Mode = GPIO_MODE_AF_PP;                            /* ¸´ÓÃÄ£Ê½ */
  gpio_init_struct.Pull = GPIO_NOPULL;                                /* ²»´øÉÏÏÂÀ­ */
  gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                      /* ¸ßËÙ */
  gpio_init_struct.Alternate = GPIO_AF1_TIM2;                          /* PA5¸´ÓÃÎªTIM2Í¨µÀ1 */
  HAL_GPIO_Init(GPIOA, &gpio_init_struct);                   /* TPADÒý½Å¸¡¿ÕÊäÈë */
}

uint16_t tpad_get_val(void)
{
    uint32_t flag = (TIM_CHANNEL_1== TIM_CHANNEL_1)?TIM_FLAG_CC1:\
                    (TIM_CHANNEL_1== TIM_CHANNEL_2)?TIM_FLAG_CC2:\
                    (TIM_CHANNEL_1== TIM_CHANNEL_3)?TIM_FLAG_CC3:TIM_FLAG_CC4;
    tpad_reset();
    while (__HAL_TIM_GET_FLAG(&htim2 ,flag) == RESET)   /* µÈ´ýÍ¨µÀCHY²¶»ñÉÏÉýÑØ */
    {
        if (htim2.Instance->CNT > 0xFFFFFFFF - 500)
        {
            return htim2.Instance->CNT;                 /* ³¬Ê±ÁË,Ö±½Ó·µ»ØCNTµÄÖµ */
        }
    }
    return TIM2->CCR1;                                      /* ·µ»Ø²¶»ñ/±È½ÏÖµ */
}


uint8_t tpad_default_val(void)
{
	uint16_t buf[10];
	uint16_t temp;
	uint8_t j, i;

	for (i = 0; i < 10; i++)                        /* Á¬Ðø¶ÁÈ¡10´Î */
	{
			buf[i] = tpad_get_val();
			HAL_Delay(10);
	}
	for (i = 0; i < 9; i++)                         /* ÅÅÐò */
	{
			for (j = i + 1; j < 10; j++)
			{
					if (buf[i] > buf[j])                    /* ÉýÐòÅÅÁÐ */
					{
							temp = buf[i];
							buf[i] = buf[j];
							buf[j] = temp;
					}
			}
	}
	temp = 0;
	for (i = 2; i < 8; i++)                         /* È¡ÖÐ¼äµÄ6¸öÊý¾Ý½øÐÐÆ½¾ù */
	{
			temp += buf[i];
	}
	tpad_default_val_data = temp / 6;

	if (tpad_default_val_data > (uint16_t)tpad_default_val_data / 2)
	{
			return 1;                                   /* ³õÊ¼»¯Óöµ½³¬¹ýTPAD_ARR_MAX_VAL/2µÄÊýÖµ,²»Õý³£! */
	}
	return 0;
}

uint8_t tpad_scan(void)
{
	uint8_t res = 0;
	uint8_t sample = 3;
	uint16_t rval=0;
	uint16_t temp=0;

	for(sample=3;sample>0;sample--)
	{
		temp=tpad_get_val();
		if(temp>rval)rval=temp;
	}
	if (rval > (tpad_default_val_data + 300))			res=1;
	return res;
}
